<?php 
/*-- Project Introduce --*/

/**
 * 控制器类 Login 
 *
 * @access public
 */
class JJ_AcceptSubscribe 
	extends JCAT_Controller 
{

	/**
	 * 构造函数 
	 * 
	 * @access	public
	 * @param	$aParent	JCAT_IController	父控制器 
	 * @return	void
	 */
	public function JJ_AcceptSubscribe(JJ_MainController $aParent)
	{
		// 调用父类构造函数
		$this->JCAT_Controller(__CLASS__,$aParent) ;
	}
	
	/**
	 * 执行入口函数 
	 * 
	 * @access	public
	 * @param	$arrArg=array	array	参数 
	 * @return	bool
	 */
	public function MainRun(array $arrArg=array())
	{
		JCAT_ASSERT::ASSERT_(isset($arrArg['JID']),JCAT_Language::Sentence('缺少参数 JID')) ;
		$sMessage = isset($arrArg['Message'])? $arrArg['Message']: null ;
		
		// 用户信息
		$aAccount = JJ_Account::CreateFromString($arrArg['JID']) ;
		$sUsername = $aAccount->GetUsername() ;
		$sAddress = $aAccount->GetJabberAddress() ;

		// 请求文本
		$aView = new JJ_AcceptSubscribeDialog($this) ;
		$wndRequestLabel = $aView->GetChildWidget('LabRequest') ;
		$sRequestWord = "用户 {$sUsername}[{$arrArg['JID']}] 正在请求订阅您的出席状态，如果您同意，当您上线或离线时，对方将得到通知。

您可以拒绝这个请求。" ;

		// 留言
		if($sMessage)
		{
			$sRequestWord.= "

来自 {$sUsername} 的留言：
“{$sMessage}”" ;
		}

		$wndRequestLabel->set_label($sRequestWord) ;
		
		
		// 取得 jabber 连接
		$aController = $this->GetParentController() ;
		$aMainController = $aController->GetTopController() ;
		$aXMPPConn = $aMainController->GetXMPPConnect() ;

		// 执行
		while(1)
		{
			// 显示视图
			$nResponse = $aView->DoDialog() ;
			
			// 接受
			if( $nResponse===Gtk::RESPONSE_OK )
			{
				//
				$sGroup = trim($aView->GetUICtrlExchangeData('SelGroup')) ;
				$sNickname = trim($aView->GetUICtrlExchangeData('EntNickname')) ;
				$sGroup = ($sGroup and $sGroup!==JCAT_Language::Sentence('无分组'))? $sGroup: null ;
				$sNickname = $sNickname? $sNickname: null ;
				
				// 发送 注册请求
				$aXMPPConn->subscription_request_accept($sAddress) ;
				
				// 添加 联系人
				$aXMPPConn->set_handler("rosteradded",$this,"OnAddContactSuccessed");
				$aXMPPConn->set_handler("rosteraddfailure",$this,"OnAddContactFailure");
				$aXMPPConn->add_contact($sAddress,$sNickname,$sGroup) ;
			
				// 等待 操作结果
				$this->bLooping = true ;
				while($this->bLooping)
				{
					usleep(200000);
					$aXMPPConn->loop_execute_once() ;
				}
				
				// 返回操作结果
				return $this->bSuccess ;
			}
			
			// 拒绝
			else
			{
				// 拒绝
				$aXMPPConn->subscription_request_deny($sAddress) ;
				
				// 退出
				break ;
			}
		}
		
		return false ;
	}
	
	/**
	 * Description
	 *
	 * @access	public
	 * @return	void
	 */
	public function OnAddContactSuccessed()
	{		
		$this->bLooping = false ;
		$this->bSuccess = true ;
	}
	/**
	 * Description
	 *
	 * @access	public
	 * @return	void
	 */
	public function OnAddContactFailure()
	{
		JCAT_Gtk::MessageDialog(JCAT_Language::Sentence('操作超时')) ;
		
		$this->bLooping = false ;
		$this->bSuccess = false ;
	}
}

?>